package Tydzien4Test;
import static org.junit.Assert.*;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import Tydzien4.KomparatorTytul;
import Tydzien4.KomparatorWydawnictwo;
import Tydzien4.KomparatorAutor;
import Tydzien4.KomparatorRokWydania;
import Tydzien4.Ksiazka;
import Tydzien4.Biblioteka;


public class Tydzien4Test {
	
	@Rule
	public ExpectedException exception = ExpectedException.none();

	@Test
	public void testAppendElement() {
		Biblioteka instance = new Biblioteka();
		Ksiazka k = new Ksiazka("Biblia", "Nieznany", "Jakiestam", 2000);
		instance.appendElement(k);
		assertEquals( k, instance.getElement(0));
	}
	
	@Test
	public void testSize() {
		Biblioteka instance = new Biblioteka();
		Ksiazka k = new Ksiazka("Biblia", "Nieznany", "Jakiestam", 2000);
		assertEquals( 0, instance.size());
		instance.appendElement(k);
		assertEquals( 1, instance.size());
	}
	
	@Test
	public void testRemoveElement() {
		Biblioteka instance = new Biblioteka();
		Ksiazka k = new Ksiazka("Biblia", "Nieznany", "Jakiestam", 2000);
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.appendElement(k);
		exception.expect(IndexOutOfBoundsException.class);
		instance.removeElement(2);
		instance.removeElement(0);
		assertEquals( k, instance.getElement(0));
	}
	
	@Test
	public void testGetElement() {
		Biblioteka instance = new Biblioteka();
		Ksiazka k = new Ksiazka("Biblia", "Nieznany", "Jakiestam", 2000);
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.appendElement(k);
		exception.expect(IndexOutOfBoundsException.class);
		instance.getElement(2);
	}

	@Test
	public void testSort() {
		Biblioteka instance = new Biblioteka();
		instance.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.sort();
		for (int i = 0; i < instance.size()-1; i++) {
			assertTrue((instance.getElement(i).toString()).compareTo(instance.getElement(i+1).toString()) < 0);
		}
	}
	
	@Test
	public void testSortTytul() {
		Biblioteka instance = new Biblioteka();
		instance.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		Biblioteka exact = new Biblioteka();
		exact.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		exact.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		exact.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.sort(new KomparatorTytul());
		assertEquals(exact, instance);
		
	}
	@Test
	public void testSortAutor() {
		Biblioteka instance = new Biblioteka();
		instance.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		Biblioteka exact = new Biblioteka();
		exact.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		exact.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		exact.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.sort(new KomparatorAutor());
		assertEquals(exact, instance);
		
	}

	@Test
	public void testSortRokWydania() {
		Biblioteka instance = new Biblioteka();
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		Biblioteka exact = new Biblioteka();
		exact.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		exact.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		exact.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		instance.sort(new KomparatorRokWydania());
		assertEquals(exact, instance);
		
	}	
	
	@Test
	public void testSortWydawnictwko() {
		Biblioteka instance = new Biblioteka();
		instance.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		instance.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		instance.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		Biblioteka exact = new Biblioteka();
		exact.appendElement(new Ksiazka("Droga", "Justyna", "Alabama", 2005));
		exact.appendElement(new Ksiazka("Cena", "Zimny", "Jakiestam", 1998));
		exact.appendElement(new Ksiazka("Biblia", "Nieznany", "PWN", 2000));
		instance.sort(new KomparatorWydawnictwo());
		assertEquals(exact, instance);
		
	}
}
